﻿using Onshi.POS.Formularios.Properties;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Entidades.Tipos;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Comun;
using Onshi.POS.Comun.Vistas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;

namespace Onshi.POS.Formularios
{
    public partial class Impuestos : FormularioBase, IImpuestos
    {
        #region Constructores

        public Impuestos(Boolean esBusqueda)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            btnSeleccionar.Visible = esBusqueda;
            presentador = new ImpuestosPresentador(this);
            procesando = new Procesando();
        }

        #endregion

        #region Atributos

        private Boolean inicializando = true;
        private ImpuestosPresentador presentador;
        private Int32 idImpuesto;
        private enum MetodoHilo { Inicializar, Actualizar, Aceptar, Eliminar, Habilitar };

        #endregion

        #region Propiedades

        [Browsable(false)]
        public List<Impuesto> ListadoImpuestos
        {
            set { bsImpuestos.DataSource = new SortableList<Impuesto>(value); }
        }

        public Int32 IdImpuestoSeleccionado
        {
            get { return idImpuesto; }
        }

        [Browsable(false)]
        public Int32 IdUsuarioSistema
        {
            get { return Principal.IdUsuarioSistema; }
        }

        [Browsable(false)]
        public String Nombre
        {
            get { return txtNombre.Text; }
        }

        [Browsable(false)]
        public String NombreFiltro
        {
            get { return txtNombreFiltro.Text; }
        }

        [Browsable(false)]
        public String Observaciones
        {
            get { return txtObservaciones.Text; }
        }

        [Browsable(false)]
        public EnumSiNo ObservacionesFiltro
        {
            get { return (EnumSiNo)((Byte)cboObservacionesFiltro.SelectedValue); }
        }

        [Browsable(false)]
        public Int32 IdImpuesto
        {
            get { return idImpuesto; }
        }

        [Browsable(false)]
        public Byte IdTipoImpuesto
        {
            get { return (Byte)cboTipoImpuesto.SelectedValue; }
        }

        [Browsable(false)]
        public Decimal Valor
        {
            get { return numValor.Value; }
        }

        [Browsable(false)]
        public Decimal MontoMaximo
        {
            get { return numMontoMaximo.Value; }
        }

        [Browsable(false)]
        public Decimal MontoAplicable
        {
            get { return numMontoAplicable.Value; }
        }

        [Browsable(false)]
        public Byte IdTipoImpuestoFiltro
        {
            get { return (Byte)cboTipoImpuestoFiltro.SelectedValue; }
        }

        [Browsable(false)]
        public Decimal ValorDesdeFiltro
        {
            get { return ucValorFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ValorHastaFiltro
        {
            get { return ucValorFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal MontoMaximoDesdeFiltro
        {
            get { return ucMontoMaximoFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal MontoMaximoHastaFiltro
        {
            get { return ucMontoMaximoFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal MontoAplicableDesdeFiltro
        {
            get { return ucMontoAplicableFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal MontoAplicableHastaFiltro
        {
            get { return ucMontoAplicableFiltro.Hasta; }
        }

        [Browsable(false)]
        public EnumActivoInactivo EstadoFiltro
        {
            get { return (EnumActivoInactivo)((Byte)cboEstadoFiltro.SelectedValue); }
        }

        #endregion

        #region Metodos

        private void ActualizarCampos()
        {
            if (bsImpuestos.Current != null)
            {
                idImpuesto = ((Impuesto)bsImpuestos.Current).Id;
                txtNombre.Text = ((Impuesto)bsImpuestos.Current).Nombre;
                txtObservaciones.Text = ((Impuesto)bsImpuestos.Current).Observaciones;
                cboTipoImpuesto.SelectedValue = ((Impuesto)bsImpuestos.Current).Tipo.Id;
                numValor.Value = ((Impuesto)bsImpuestos.Current).Valor;
                numMontoAplicable.Value = ((Impuesto)bsImpuestos.Current).MontoAplicable;
                numMontoMaximo.Value = ((Impuesto)bsImpuestos.Current).MontoMaximo;
            }
            else
                LimpiarCampos();
        }

        private void LimpiarFiltro()
        {
            inicializando = true;
            txtNombreFiltro.Text = String.Empty;
            cboObservacionesFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            cboEstadoFiltro.SelectedValue = (Byte)EnumActivoInactivo.Todos;
            cboTipoImpuestoFiltro.SelectedValue = (Byte)EnumTiposImpuestos.Todos;
            ucValorFiltro.LimpiarCampos();
            ucMontoAplicableFiltro.LimpiarCampos();
            ucMontoMaximoFiltro.LimpiarCampos();
            inicializando = false;
        }

        private void LimpiarCampos()
        {
            errImpuestos.Clear();
            idImpuesto = 0;
            txtNombre.Text = String.Empty;
            txtObservaciones.Text = String.Empty;
            cboTipoImpuesto.SelectedIndex = -1;
            numValor.Value = Decimal.Zero;
            numMontoAplicable.Value = Decimal.Zero;
            numMontoMaximo.Value = Decimal.Zero;
        }

        private void HabilitarControles(Boolean habilitar)
        {
            txtNombre.Enabled = habilitar;
            txtObservaciones.Enabled = habilitar;
            cboTipoImpuesto.Enabled = habilitar;
            numValor.Enabled = habilitar;
            numMontoMaximo.Enabled = habilitar;
            numMontoAplicable.Enabled = habilitar;
            btnNuevo.Enabled = !habilitar;
            btnModificar.Enabled = !habilitar;
            btnEliminar.Enabled = !habilitar;
            btnHabilitar.Enabled = !habilitar;
            btnAceptar.Enabled = habilitar;
            btnCancelar.Enabled = habilitar;
            navSubRubrosArticulos.Enabled = !habilitar;
            if (!habilitar)
                ValidarControles();
        }

        private void ValidarControles()
        {
            if (bsImpuestos.Current != null)
            {
                btnSeleccionar.Enabled = true;
                if (((Impuesto)bsImpuestos.Current).EstaEliminado)
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = false;
                    btnHabilitar.Enabled = true;
                }
                else
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                    btnHabilitar.Enabled = false;
                }
            }
            else
            {
                idImpuesto = 0;
                btnModificar.Enabled = false;
                btnEliminar.Enabled = false;
                btnHabilitar.Enabled = false;
                btnSeleccionar.Enabled = false;
            }
        }

        private void Filtrar()
        {
            if (!inicializando)
                presentador.Filtrar();
        }

        #endregion

        #region Eventos

        #region Filtro

        private void txtNombreFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboObservacionesFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboTipoImpuestoFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucValorFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucMontoAplicableFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucMontoMaximoFiltro_CambioValor()
        {
            Filtrar();
        }

        private void cboEstadoFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        #endregion

        private void Impuestos_Load(Object sender, EventArgs e)
        {
            solImpuestos.SelectedTab = tabDetalle;
            solImpuestos.SelectedTab = tabListado;
            grdImpuestos.ScrollBars = ScrollBars.None;
            bgwImpuestos.RunWorkerAsync(MetodoHilo.Inicializar);
            procesando.ShowDialog();
        }

        private void btnNuevo_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(true);
            cboTipoImpuesto.SelectedValue = (Byte)EnumTiposImpuestos.Porcentaje;
            txtNombre.Focus();
        }

        private void btnModificar_Click(Object sender, EventArgs e)
        {
            HabilitarControles(true);
            txtNombre.Focus();
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea eliminar impuesto?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwImpuestos.RunWorkerAsync(MetodoHilo.Eliminar);
                procesando.ShowDialog();
            }
        }

        private void btnHabilitar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro que desea habilitar el impuesto?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwImpuestos.RunWorkerAsync(MetodoHilo.Habilitar);
                procesando.ShowDialog();
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            var validado = true;
            errImpuestos.Clear();
            if (String.IsNullOrWhiteSpace(txtNombre.Text))
            {
                validado = false;
                errImpuestos.SetError(txtNombre, "El nombre no puede quedar vacío");
            }
            if (validado)
            {
                bgwImpuestos.RunWorkerAsync(MetodoHilo.Aceptar);
                procesando.ShowDialog();
            }
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(false);
            ActualizarCampos();
        }

        private void btnActualizar_Click(Object sender, EventArgs e)
        {
            bgwImpuestos.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnSeleccionar_Click(Object sender, EventArgs e)
        {
            idImpuesto = ((Impuesto)bsImpuestos.Current).Id;
            DialogResult = DialogResult.OK;
        }

        private void btnSalir_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnLimpiar_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void solImpuestos_Selecting(Object sender, TabControlCancelEventArgs e)
        {
            if (solImpuestos.SelectedTab == tabDetalle)
                ActualizarCampos();
            else
                if (!navSubRubrosArticulos.Enabled)
                    e.Cancel = true;
        }

        private void grdImpuestos_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (bsImpuestos.Count > 0 && bsImpuestos.Count == grdImpuestos.RowCount)
            {
                if (((Impuesto)bsImpuestos.List[e.RowIndex]).EstaEliminado)
                    grdImpuestos.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightCoral;
                if (grdImpuestos.Columns[e.ColumnIndex].Index == colObservaciones.Index)
                    if (((Impuesto)bsImpuestos.List[e.RowIndex]).TieneObservaciones)
                        e.Value = Properties.Resources.page_copy;
            }
        }

        private void grdImpuestos_CellClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (bsImpuestos.Current != null && e.ColumnIndex == colDetalle.Index)
                {
                    var subRubrosArticulosDetalle = new SubRubrosArticulosDetalle(((SubRubroArticulo)bsImpuestos.Current).Id);
                    subRubrosArticulosDetalle.ShowDialog();
                }
        }

        private void bgwImpuestos_DoWork(Object sender, DoWorkEventArgs e)
        {
            try
            {
                switch ((MetodoHilo)e.Argument)
                {
                    case MetodoHilo.Inicializar:
                        presentador.Inicializar();
                        cboObservacionesFiltro.Actualizar();
                        cboEstadoFiltro.Actualizar();
                        cboTipoImpuestoFiltro.Actualizar();
                        cboTipoImpuesto.Actualizar();
                        ucValorFiltro.Actualizar();
                        ucMontoAplicableFiltro.Actualizar();
                        ucMontoMaximoFiltro.Actualizar();
                        break;
                    case MetodoHilo.Actualizar:
                        presentador.Actualizar();
                        break;
                    case MetodoHilo.Aceptar:
                        presentador.Aceptar();
                        LimpiarCampos();
                        HabilitarControles(false);
                        ActualizarCampos();
                        solImpuestos.SelectedTab = tabListado;
                        break;
                    case MetodoHilo.Eliminar:
                        presentador.Eliminar();
                        LimpiarCampos();
                        ActualizarCampos();
                        solImpuestos.SelectedTab = tabListado;
                        break;
                    case MetodoHilo.Habilitar:
                        presentador.Habilitar();
                        LimpiarCampos();
                        ActualizarCampos();
                        solImpuestos.SelectedTab = tabListado;
                        break;
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(ex.Message);
            }
        }

        private void bgwImpuestos_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
        {
            inicializando = false;
            procesando.Close();
            if (e.Error != null)
                MessageBox.Show(e.Error.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                actImpuestos.Actualizar();
            grdImpuestos.ScrollBars = ScrollBars.Both;
        }

        private void bsImpuestos_PositionChanged(Object sender, EventArgs e)
        {
            if (solImpuestos.SelectedTab == tabDetalle)
                ActualizarCampos();
        }

        private void grdImpuestos_SelectionChanged(Object sender, EventArgs e)
        {
            ValidarControles();
        }

        private void cboTipoImpuesto_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            switch ((EnumTiposImpuestos)(Byte)cboTipoImpuesto.SelectedValue)
            {
                case EnumTiposImpuestos.Porcentaje:
                    numMontoMaximo.Enabled = true;
                    break;
                case EnumTiposImpuestos.MontoFijo:
                    numMontoMaximo.Enabled = false;
                    numMontoMaximo.Value = 0;
                    break;
            }
        }

        #endregion
    }
}